package com.clouddong.exterapi.websocket;

import com.clouddong.exterapi.util.WebSocketMapUtil;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

/**
 * @ServerEndpoint 注解是一个类层次的注解，它的功能主要是将目前的类定义成一个websocket服务器端,
 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
 */
@ServerEndpoint("/websocket")
public class WebSocket {
	//与某个客户端的连接会话，需要通过它来给客户端发送数据
	private Session session;
	/**
	 * 连接建立成功调用的方法
	 * @param session  可选的参数。session为与某个客户端的连接会话，需要通过它来给客户端发送数据
	 * @throws Exception
	 */
	@OnOpen
	public void onOpen(Session session) throws Exception{
		this.session = session;
		WebSocketMapUtil.put(session.getQueryString(),this);
	}

	/**
	 * 连接关闭调用的方法
	 * @throws Exception
	 */
	@OnClose
	public void onClose() throws Exception{
		//从map中删除
		WebSocketMapUtil.remove(session.getQueryString());
	}

	/**
	 * 收到客户端消息后调用的方法
	 * @param message 客户端发送过来的消息
	 * @param session 可选的参数
	 * @throws IOException
	 */
	@OnMessage
	public void onMessage(String message, Session session) throws IOException {
		try {
			WebSocket myWebSocket= ((WebSocket) WebSocketMapUtil.get(session.getQueryString().replace("service", "client")));
			System.out.println("服务器调用webSocket发送给页面的message:"+message);
			if(myWebSocket != null){
				myWebSocket.sendMessage(message);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 发生错误时调用
	 * @param session
	 * @param error
	 */
	@OnError
	public void onError(Session session, Throwable error){
		error.printStackTrace();
	}


	/**
	 * 发送消息方法。
	 * @param message
	 * @throws IOException
	 */
	public void sendMessage(String message) throws IOException{
		this.session.getBasicRemote().sendText(message);
	}

	/**
	 * 群发消息方法。
	 * @param message
	 * @throws IOException
	 */
	public void sendMessageAll(String message) throws IOException{
		for(WebSocket myWebSocket : WebSocketMapUtil.getValues()){
			myWebSocket.sendMessage(message);
		}
	}
}
